class MyClass:

    # 定义类属性
    count = 500

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 类方法的第一个参数是 cls=MyClass，代表类本身，而不是实例，类方法，可以通过类名或者实例直接调用
    @classmethod
    def get_count(cls):
        return cls.count

    @classmethod
    def add(cls, x, y):
        return cls.count + x + y

    # 定义实例方法
    def mul(self, x, y):
        return self.count * x * y

    # 定义类的静态方法，第一个参数不需要传cls=Myclass
    @staticmethod
    def div(x, y):
        return x / y


print(MyClass.get_count)

print(MyClass.add(100, 200))

myclass = MyClass("linda", 20)

print(myclass.add(10, 20))
print(myclass.mul(10, 20))

print(MyClass.mul(MyClass, 20, 30))

# 调用类的静态方法,通过类名直接调用，类的静态方法不关心

print(MyClass.div(100, 20))


# 创建一个： Student 类中的例子，get_school_info 是类方法，用于访问类属性；is_passing_grade 和 calculate_average 是静态方法，用于通用的功能，无需关注类或实例属性
class Student:

    # 类属性
    student_count = 0

    def __init__(self, name, grade):
        self.name = name
        self.grade = grade

        # 通过类属性统计创建了多个学生实例
        Student.student_count += 1

    # 实例方法：获取学生信息
    def get_info(self):
        # 返回学生的姓名和成绩信息
        return f"{self.name} - Grade {self.grade}"

    @classmethod
    def get_stu_info(cls):
        return f"{cls.name}-{cls.grade}"

    @staticmethod
    def is_passing_grade():
        pass

    @staticmethod
    def calculate_average():
        pass


def generate_stu():
    import random
    import math

    while True:
        name = f"A00{math.floor(random.random()*1000000)}"
        grade = math.floor(random.random() * 100)
        yield Student(name, grade)


gen = generate_stu()
for i in range(10):
    gen.__next__()

print(f"总共初始化了{Student.student_count}个实例")

stu = Student("SUSAN", 100)


def refelct_instance(obj):
    if isinstance(obj, Student):
        for attr in dir(obj):
            if attr.startswith("__"):  # 是魔术方法的话，继续
                print("魔术方法=", attr)
                continue
            else:
                value = getattr(obj, attr)
                if callable(value):
                    print(f"方法名为:{value.__name__}:")
                    # obj[attr]()
                else:
                    print(f"[属性] {attr} = {value}")


refelct_instance(stu)
